# Реализация аутентификации и авторизации с использованием Spring Security и JWT

Выполнено как задание в открытой школе T1:
> Создать базовое веб-приложение с использованием Spring Security и JWT для аутентификации и авторизации пользователей.

## Запуск

* Клонировать проект
* Скомпилировать
* Запустить docker контейнеры
* Все java приложения будут запущены в своих контейнерах

```bash
git clone https://github.com/GibbedHead/tz4-springsecurity-jwt.git
cd .\tz4-springsecurity-jwt\
mvn package
docker compose up -d
java -jar .\target\SpringSecurityJwtHomework-0.0.1-SNAPSHOT.jar
```

## Детали реализации

Проект написан для Java 17. Использует Postgresql 16 и spring web и spring security

При регистрации и аутентификации получаем jwt access token и refresh token. Используя refresh token можно обновить
access token по его истечению.

* Реализованы эендпоинты для регистрации, аутентификации пользователей и обновлению access token через передачу refresh
  token. В файле [api-docs.yaml](api-docs.yaml) содержится OpenApi спецификация реализованного API.
* Реализованы открытый, закрытый аутентификацией и закрытый ролью admin тестовые эндпоинты

## Тесты postman

В файле [postman.json](postman.json) приложена простая коллекция для тестов:

* В папке **Manual** лежат запросы ко всем используемым эндпоинтам для ручной проверки, где можно вручную создавать и
  передавать jwt токены
* В папке **Tests** простые тесты с проводящие регистрацию, вход под тестовым пользователем и админом и проверка
  защищенных эндпоинтов

## Полная задача

    Задание:
    Реализация аутентификации и авторизации с использованием Spring Security и JWT
    
    Цель задания:
    Создать базовое веб-приложение с использованием Spring Security и JWT для аутентификации и авторизации пользователей.
    
    Шаги задания:
    Настройка проекта:
    Создайте новый проект Spring Boot.
    Настройка конфигурации безопасности:
    Настройте базовую конфигурацию Spring Security для вашего приложения.
    Используйте JWT для аутентификации пользователей.
    Создайте класс для генерации и проверки JWT токенов.
    Реализация контроллеров:
    Создайте контроллеры для аутентификации и регистрации пользователей.
    Реализуйте методы для создания нового пользователя и генерации JWT токена при успешной аутентификации.
    Реализуйте сохранение пользователей в базу данных PostgreSQL.
    Добавьте поддержку ролей пользователей и настройте авторизацию на основе ролей.
    Тестирование:
    Напишите модульные тесты для контроллеров и сервисов.
    Убедитесь, что аутентификация и авторизация работают корректно.
    Проверьте, что только аутентифицированные пользователи имеют доступ к защищенным ресурсам.
